#!/usr/bin/env bash
# 文件名: check_prebuild_env.sh
# https://github.com/unitreerobotics/unitree_sdk2.git
set -euo pipefail

RED='\033[31m'; GREEN='\033[32m'; YELLOW='\033[33m'; NC='\033[0m'
log_info()  { echo -e "${GREEN}[INFO]${NC}  $*"; }
log_warn()  { echo -e "${YELLOW}[WARN]${NC}  $*"; }
log_error() { echo -e "${RED}[ERROR]${NC} $*"; }
exit_fail() { log_error "Prebuild 环境检查未通过！"; exit 1; }
exit_ok()   { log_info  "Prebuild 环境已就绪！"; exit 0; }

# ---------------- 工具函数 ----------------
# 逐段数值比较：ver_ge 12.2.0 9.4.0 返回 0（真）
ver_ge() {
    local IFS=.
    local i a=($1) b=($2)
    for ((i=0; i<${#a[@]} || i<${#b[@]}; i++)); do
        (( ${a[i]:-0} > ${b[i]:-0} )) && return 0
        (( ${a[i]:-0} < ${b[i]:-0} )) && return 1
    done
    return 0
}

# 1. OS 版本（Ubuntu 20.04+ 或 Debian 11+）
check_os() {
    [[ -f /etc/os-release ]] || { log_error "无法识别系统版本"; return 1; }
    source /etc/os-release
    case "$ID" in
        ubuntu)
            ver_ge "$VERSION_ID" "20.04" && \
                { log_info "OS: Ubuntu $VERSION_ID (符合 ≥ 20.04)"; return 0; } || \
                { log_error "Ubuntu 版本过低: $VERSION_ID，需要 ≥ 20.04"; return 1; }
            ;;
        debian)
            ver_ge "$VERSION_ID" "11" && \
                { log_info "OS: Debian $VERSION_ID (符合 ≥ 11  )"; return 0; } || \
                { log_error "Debian 版本过低: $VERSION_ID，需要 ≥ 11 OR OS (Ubuntu 20.04 LTS)"; return 1; }
            ;;
        *)
            log_error "仅支持 Ubuntu / Debian，当前系统: $ID"
            return 1
            ;;
    esac
}

# 2. CPU 架构提示
check_arch() {
    local arch=$(uname -m)
    case "$arch" in
        x86_64|aarch64) log_info "CPU 架构: $arch（支持）" ;;
        *)              log_warn "CPU 架构: $arch（未在官方支持列表）" ;;
    esac
}

# 3. GCC 版本
check_gcc() {
    command -v gcc &>/dev/null || { log_error "GCC 未安装，执行：sudo apt install gcc"; return 1; }
    local gcc_ver=$(gcc -dumpfullversion 2>/dev/null || gcc -dumpversion)
    if ver_ge "$gcc_ver" "9.4.0"; then
        log_info "GCC 版本: $gcc_ver (符合 ≥ 9.4.0)"
    else
        log_error "GCC 版本过低: $gcc_ver，需要 ≥ 9.4.0"
        return 1
    fi
}

# 4. CMake 版本
check_cmake() {
    command -v cmake &>/dev/null || { log_error "CMake 未安装，执行：sudo apt install cmake"; return 1; }
    local cmake_ver=$(cmake --version | grep -oP '\d+\.\d+\.\d+')
    if ver_ge "$cmake_ver" "3.10.0"; then
        log_info "CMake 版本: $cmake_ver (符合 ≥ 3.10)"
    else
        log_error "CMake 版本过低: $cmake_ver，需要 ≥ 3.10"
        return 1
    fi
}

# 5. Make
check_make() {
    command -v make &>/dev/null || { log_error "Make 未安装，执行：sudo apt install make"; return 1; }
    local mk_ver=$(make --version | head -n1 | grep -oP '\d+\.\d+')
    log_info "Make 版本: $mk_ver (已安装)"
}

# ---------------- 主流程 ----------------
main() {
    local FAIL=0
    check_os     || FAIL=1
    check_arch
    check_gcc    || FAIL=1
    check_cmake  || FAIL=1
    check_make   || FAIL=1

    [ $FAIL -eq 0 ] && exit_ok || exit_fail
}

main "$@"